package hu.comicsans;

import java.util.Random;

/**
 * Egy dinamikusan mozgó objektum, ami időről időre megjelenik a pályán. Egy hangyával
 * interakcióba lépve, amennyiben még éhes, törli a hangyát és csökkenti a saját éhségét.
 */
public class HangyaszSun extends SikbeliElem implements Frissitheto {

	/**
	 * kezdetben 1-5 között random generált szám, minden hangya megevésekor
	 * eggyel csökken az értéke
	 */
	private int ehseg;
	
	/**
	 * a hangyászsün maximális lehetséges éhsége
	 */
	private final static int maxEhseg = 5;
	
	/**
	 * egy referencia a sünt tartalmazó pályára
	 */
	private Palya enPalyam;
	
	/**
	 * Hangyászsün inicializálása
	 * @param palya 
	 * 
	 * @param posX kezdeti X koordináta
	 * @param posY kezdeti Y koordináta
	 */
	public HangyaszSun(Palya palya, double posX, double posY, double sebX, double sebY) {
		super(posX, posY, 20);

		Random generator = new Random();

		this.sebesseg = new Vektor(sebX, sebY);
		this.ehseg = generator.nextInt(maxEhseg);
		this.enPalyam = palya;
	}
	
	/**
	 * Ez a metódus mozgatja az objektumot.
	 */
	@Override
	public void frissit(long elteltIdo) {
		pozicio.x += sebesseg.x;
		pozicio.y += sebesseg.y;
		
		if (pozicio.x-sugar > Jatek.szelesseg || pozicio.y-sugar > Jatek.magassag)
		{
			meghal();
		}
	}
	
	/**
	 * Amennyiben ütközés történt egy hangyával, ez a metódus csökkenti a hangyászsün
	 * éhségét eggyel, valamint meghívja a hangya meghal() metódusát, ezáltal elpusztítva a hangyát.
	 * 
	 * @param h A megenni kívánt hangya.
	 */
	public void megesz(Hangya h) {
		ehseg--;
		h.meghal();
	}
	
	/**
	 * Annak lekérdezése, hogy a sün még éhes-e.
	 * 
	 * @return igaz, ha éhes még
	 */
	private Boolean ehesVagyok()
	{
		if (ehseg == 0)
		{
			return false;
		}
		
		return true;
	}

	/**
	 * A hangyával való ütközést kezeli, meghívja a saját megesz() metódusát.
	 * 
	 * @param h A hangya, amivel a sün ütközhet.
	 */
	public void utkozesKezelese(Hangya h) {
		if (Jatek.ketKorMetsziEgymast(pozicio, sugar, h.pozicio, h.sugar))
		{			
			if (ehesVagyok())
			{
				megesz(h);
			}
		}
	}
	
	/**
	 * A kaviccsal való ütközést kezeli
	 * @param k a kavics, amivel a sün ütközhet
	 */
	public void utkozesKezelese(Kavics k) {
		
		if (Jatek.ketKorMetsziEgymast(pozicio, sugar, k.pozicio, k.sugar))
		{	
			//visszalépünk egy egységnyit
			this.pozicio.x -= sebesseg.x;
			this.pozicio.y -= sebesseg.y;
			
			if (!k.mozogj(sebesseg))
			{
				//ha a kavics beragadt, megfordulunk
				
				sebesseg.x *= -1;
				sebesseg.y *= -1;
			}
		}
	}
	
	/**
	 * ha kiment a pályáról, ez a függvény hívódik meg
	 */
	private void meghal()
	{
		enPalyam.hangyaszSun = null;
		enPalyam = null;
	}
}
